﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;
using NHibernateClass;

namespace GerPlayHouse
{
    public partial class Form1 : Form
    {
        Thread t;
        Thread t1;
        public List<Cliente> listaCliente = new List<Cliente>();

        public delegate void InvokeDelegate();

        Cliente c1;

        public Form1()
        {
            InitializeComponent();
            try
            {
                FacadeSerial.Instance.enviarStringPorta("0");
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            c1 = new Cliente(1,"NEO", 8);

            listaCliente.Add(c1);

            List<Control> availControls = AdicionarEvento(this);

            lbMensagem.Text = "";
            imagemMensagem.Visible = false;
            label01A.Visible = false;
            label01B.Visible = false;

            t1 = new Thread(atualizarTerminais);
            t1.Start();

            AnalistasDAO.listAll();



        }

        public void threadLeitura()
        {
            while (true)
            {
                Thread.Sleep(200);
                try
                {
                    //if (port.ReadExisting().Length > 0)
                    {
                        try{
                            string linha = FacadeSerial.Instance.obterStringPorta();
                            if (!linha.Equals(""))
                            {
                                //listBox1.Items.Add(linha);
                                setCorButton(linha);
                            }
                        }
                        catch (Exception e){}
                    }
                }
                catch (Exception e) {
                    //MessageBox.Show(e.Message);
                }
            }
        }

        private void atualizarTerminais()
        {
            while (true)
            {
                foreach (Cliente cliente in listaCliente) // Loop through List with foreach
                {
                    try
                    {
                        label01A.BeginInvoke((MethodInvoker)delegate
                        {
                            if (cliente.DecrementarTempo == true)
                            {
                                cliente.Tempo -= 1;
                                label01A.Text = formataTempo(cliente.Tempo);
                            }

                            if (cliente.Tempo < 1)
                            {
                                desalocarCliente(cliente);
                            }
                        });
                    }
                    catch (InvalidOperationException e) { }
                }
                Thread.Sleep(1000);
            }
        }

        private void setCorButton(string linha)
        {
            linha = linha.Substring(0, linha.Length - 1);
            if (linha.Equals("PIN71H") || linha.Equals("PIN71S")){
                //button1.BackColor = System.Drawing.Color.Green;
            }
            else if (linha.Equals("PIN70H") || linha.Equals("PIN70S"))
            {
                //button1.BackColor = System.Drawing.Color.Red;
            }
        }


        private void button1_Click(object sender, EventArgs e)
        {
            //port.Write("1");
            //FacadeSerial.Instance.enviarStringPorta("1");
        }


        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            t.Abort();
            t1.Abort();
            try{
                FacadeSerial.Instance.fecharPorta();
            }
            catch (Exception ex){}
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            CheckForIllegalCrossThreadCalls = false;
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void Form1_Load_1(object sender, EventArgs e)
        {
            // dispara uma nova thread para executar
            t = new Thread(threadLeitura);
            t.Start();
        }

        private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
        {

        }

        private void pictureBox1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            MessageBox.Show("teste");
        }

        private void pictureBox1_ContextMenuStripChanged(object sender, EventArgs e)
        {
            MessageBox.Show("teste2");
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            //System.Media.SoundPlayer myPlayer = new System.Media.SoundPlayer();
            //myPlayer.SoundLocation = @"C:\Documents and Settings\Usuario\Meus documentos\GerPlayHouse\desktop\GerPlayHouse\sounds\beep-8.wav";
            //myPlayer.Play();
            iniciarSessao(c1, label01A);
        }

        private void panel2_Paint(object sender, PaintEventArgs e)
        {

        }

        public string formataTempo(int segundos)
        {
            
            int hora = 0;
            try { hora = (int)(segundos / 3600); }catch (Exception e) { }
            segundos = (segundos - (hora*3600));
            int minuto = 0;
            try { minuto = (int)(segundos / 60); }catch (Exception e) { }
            segundos = (segundos - (minuto * 60));
            return String.Format("{0:00}", hora) + ":" + String.Format("{0:00}", minuto) + ":" + String.Format("{0:00}", segundos);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            alocarClienteTerminal(c1, (Terminal)TERMINAL01);
            BTA01.Enabled = true;
        }

        private void alocarClienteTerminal(Cliente cliente, Terminal terminal)
        {
            Rotulo label = null;
            if (terminal.Name.Equals("TERMINAL01")) { label = label01B; }
            else if (terminal.Name.Equals("TERMINAL02")) { label = label02B; }
            else if (terminal.Name.Equals("TERMINAL03")) { label = label03B; }
            else if (terminal.Name.Equals("TERMINAL04")) { label = label04B; }
            else if (terminal.Name.Equals("TERMINAL05")) { label = label05B; }
            else if (terminal.Name.Equals("TERMINAL06")) { label = label06B; }
            else if (terminal.Name.Equals("TERMINAL07")) { label = label07B; }
            else if (terminal.Name.Equals("TERMINAL08")) { label = label08B; }
            else if (terminal.Name.Equals("TERMINAL09")) { label = label09B; }
            else if (terminal.Name.Equals("TERMINAL10")) { label = label10B; }
            terminal.Cliente = cliente;
            terminal.LabelCliente.Text = cliente.Nome;
            terminal.LabelTempo.Text = formataTempo(cliente.Tempo);
            terminal.LabelCliente.Visible = true;
            terminal.LabelTempo.Visible = true;
            
        }

        private void exibirMensagem(string msg)
        {
            lbMensagem.Text = msg;
        }

        public void removeMensagem() {
            lbMensagem.Text = "";
            imagemMensagem.Visible = false;
        }

        private void notificaIniciarSessao(object sender, EventArgs e)
        {
            exibirMensagem("Iniciar sessão");
            imagemMensagem.Visible = true;
        }

        private void button1_MouseLeave(object sender, EventArgs e)
        {
            removeMensagem();
        }

        private void iniciarSessao(Cliente cliente,Label label)
        {
            cliente.DecrementarTempo = true;
            Terminal terminal = obterTerminalByCliente(cliente);
            if(terminal != null){
                try
                {
                    FacadeSerial.Instance.enviarStringPorta(terminal.StrAtivar);
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
            }
        }

        private void notificaAlocarCliente(object sender, EventArgs e)
        {
            exibirMensagem("Alocar cliente no terminal");
            imagemMensagem.Visible = true;
        }

        private void notificaOutrasOpcoes(object sender, EventArgs e)
        {
            exibirMensagem("Outras opções");
            imagemMensagem.Visible = true;
        }

        private void button2_MouseLeave(object sender, EventArgs e)
        {
            removeMensagem();
        }

        private void button16_MouseLeave(object sender, EventArgs e)
        {
            removeMensagem();
        }

        public List<Control> AdicionarEvento(Control form)
        {
            var controlList = new List<Control>();

            foreach (Control childControl in form.Controls)
            {
                // Recurse child controls.
                controlList.AddRange(AdicionarEvento(childControl));
                controlList.Add(childControl);
                if (childControl.GetType().ToString().Equals("GerPlayHouse.Botao"))
                {
                    //MessageBox.Show(childControl.Name);
                    childControl.MouseLeave += new System.EventHandler(button_MouseLeave);
                    if (childControl.Name.Length > 3)
                    {
                        if (childControl.Name.Substring(2, 1).Equals("A"))
                        {
                            childControl.MouseHover += new System.EventHandler(notificaIniciarSessao);
                            childControl.Enabled = false;
                        }
                        else if (childControl.Name.Substring(2, 1).Equals("B"))
                        {
                            childControl.MouseHover += new System.EventHandler(notificaAlocarCliente);
                        }
                        else if (childControl.Name.Substring(2, 1).Equals("C"))
                        {
                            childControl.MouseHover += new System.EventHandler(notificaOutrasOpcoes);
                        }

                    }
                }
            }
            return controlList;
        }

        private void button_MouseLeave(object sender, EventArgs e)
        {
            removeMensagem();
        }

        private void desalocarCliente(Cliente cliente)
        {
            List<Terminal>terminaisAtivos = obterTerminaisAtivos();
            foreach (Terminal terminal in terminaisAtivos)
            {
                if (terminal.Cliente != null)
                {
                    if (terminal.Cliente.Id == cliente.Id)
                    {
                        cliente.DecrementarTempo = false;
                        terminal.Cliente = null;
                        terminal.LabelTempo.Text = "00:00:00";
                        try
                        {
                            FacadeSerial.Instance.enviarStringPorta(terminal.StrDesativar);
                        }
                        catch (Exception e)
                        {
                            MessageBox.Show(e.Message);
                        }
                    }
                }
            }
        }

        private List<Terminal> obterTerminaisAtivos()
        {
            List<Terminal> listaTerminais = new List<Terminal>();
            List<Terminal> listaTodosTerminais = obterTodosTerminais();
            foreach(Terminal terminal in listaTodosTerminais){
                if(terminal.Enabled == true){
                    listaTerminais.Add(terminal);
                }
            }

            return listaTerminais;
        }

        private List<Terminal> obterTodosTerminais()
        {
            List<Terminal> listaTerminais = new List<Terminal>();
            listaTerminais.Add(TERMINAL01);
            listaTerminais.Add(TERMINAL02);
            listaTerminais.Add(TERMINAL03);
            listaTerminais.Add(TERMINAL04);
            listaTerminais.Add(TERMINAL05);
            listaTerminais.Add(TERMINAL06);
            listaTerminais.Add(TERMINAL07);
            listaTerminais.Add(TERMINAL08);
            listaTerminais.Add(TERMINAL09);
            listaTerminais.Add(TERMINAL10);
            return listaTerminais;
        }

        private Terminal obterTerminalByCliente(Cliente cliente) {
            foreach (Terminal terminal in obterTerminaisAtivos())
            {
                if (terminal.Cliente != null)
                {
                    if (terminal.Cliente.Id == cliente.Id)
                    {
                        return terminal;
                    }
                }
            }
            return null;
        }

    }
}
